package models

import (
	"time"
)

func (rt *RunTime) 动作_显示加入行会() {
	tx := CreateBuff(7)
	tx.AddInt16(0x0063)
	tx.AddStringAndLen(rt.V角色.V行会名)
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_显示申请行会列表() {
	会长 := &S角色列表{}
	session := db.NewSession()
	session = session.Where("行会名=?", rt.V角色.V行会名).Where("会长=?", true)
	//domain := fmt.Sprintf("[V行会名,=,'%s']&[V会长,=,true]", rt.V角色.V行会名)
	if ok, _ := session.Get(会长); ok == false {
		rt.消息_系统消息(3, "获取行会会长信息出错")
		return
	}
	tx := CreateBuff(100)
	tx.AddInt16(0x0062)
	tx.AddStringAndLen(rt.V角色.V行会名)
	tx.AddStringAndLen(会长.V名字)
	session = db.NewSession()
	session = session.Where("行会名=?", rt.V角色.V行会名)
	//	domain = fmt.Sprintf("[V行会名,=,'%s']", "+"+rt.V角色.V行会名)
	var 行会成员 []*S角色列表
	if err := session.Find(&行会成员); err != nil {
		rt.消息_系统消息(3, "获取行会信息出错!"+err.Error())
		return
	}
	tx.AddInt32(int32(len(行会成员))) //会员人数
	for _, v := range 行会成员 {
		tx.AddStringAndLen(v.V名字)
	}
	tx.AddInt32(0)
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_显示行会信息() {
	tx := CreateBuff(100)
	tx.AddInt16(0x0061)
	tx.AddStringAndLen(rt.V角色.V行会名)
	tx.AddByte(0)
	tx.AddInt32(0) //行会最多人数 4A 00 00 00

	会长 := &S角色列表{}
	//domain := fmt.Sprintf("[V行会名,=,'%s']&[V会长,=,true]", rt.V角色.V行会名)
	if ok, _ := db.Where("行会名=?", rt.V角色.V行会名).Where("会长=?", true).Get(会长); ok == false {
		rt.消息_系统消息(3, "获取行会会长信息出错")
		return
	}
	tx.AddStringAndLen(会长.V名字)
	tx.AddInt32(0) //未知

	//domain = fmt.Sprintf("[V行会名,=,'%s']", rt.V角色.V行会名)
	var 成员列表 []*S角色列表
	if ok, _ := db.Where("行会名=?", rt.V角色.V行会名).Get(&成员列表); ok == false {
		rt.消息_系统消息(3, "获取行会信息出错")
		return
	}
	tx.AddInt32(int32(len(成员列表))) //会员人数
	for _, v := range 成员列表 {
		tx.AddStringAndLen(v.V名字)
		tx.AddInt32(1)
		tx.AddByte(0)
		tx.AddByte(0)
		_, ok := m_RunTime.Load(v.V名字)
		tx.AddBool(ok) //是否在线
	}
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_变身(变身 bool) {
	tx := CreateBuff(3)
	tx.AddInt16(0x0189)
	tx.AddBool(变身)
	//先对自己发送
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_切换PK() {
	tx := CreateBuff(3)
	tx.AddInt16(0x00C4)
	if rt.V角色.VPK == true {
		tx.AddByte(0x19)
	} else {
		tx.AddByte(0x1A)
	}
	//先对自己发送
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})

	tx = CreateBuff(7)
	tx.AddInt32(rt.V角色内容.Id)
	tx.AddInt16(0x00C5)
	if rt.V角色.VPK == true {
		tx.AddByte(0x19)
	} else {
		tx.AddByte(0x1A)
	}
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}

//功能 一个怪物攻击了角色，并广播周边所有人
func (rt *RunTime) 动作_远程物理攻击(SrcId, DecId, x, y int32, 技能名称 string) {
	tx := CreateBuff(4 + 2 + 4 + len(技能名称) + 4*8 + 1)
	tx.AddInt32(SrcId)
	tx.AddInt16(0x0138)
	tx.AddStringAndLen(技能名称) //技能名称
	tx.AddFloat(1)
	tx.AddInt32(0x01)
	tx.AddInt32(DecId)
	tx.AddInt32(x)
	tx.AddInt32(y)
	tx.AddInt32(0)
	tx.AddInt32(1)
	tx.AddInt32(0)
	tx.AddByte(0)
	//先对自己发送
	rt.AddHeadSend10(0x0B, [][]byte{tx.Buff[:4], tx.Buff[4:]})

	tx = CreateBuff(4 + 2 + 4 + len(技能名称) + 4 + 4 + 4 + 4)
	tx.AddInt32(SrcId)
	tx.AddInt16(0x0131)
	tx.AddStringAndLen(技能名称)
	tx.AddInt32(DecId)
	tx.AddInt32(x)
	tx.AddInt32(y)
	tx.AddInt32(-6310) //	5A E7 FF FF
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}

//功能 一个怪物攻击了角色，并广播周边所有人
func (rt *RunTime) 动作_魔法攻击(SrcId, DecId, x, y int32, 技能名称 string) {
	/*
		0B 14 04 00 1D 00 00 00 00 00 00 00 00 00 00 00 12 14
		44 9A 07 00
		30 01 0B 00 00 00 41 70 6F 63 61 6C 79 70 73 65 00 45 9A 07 00 E8 53 FB FF 60 D4 0C 00
		0B 14 04 00 21 00 00 00 00 00 00 00 00 00 00 00 2E 14
		44 9A 07 00
		31 01 0B 00 00 00 41 70 6F 63 61 6C 79 70 73 65 00 45 9A 07 00 E8 53 FB FF 60 D4 0C 00 00 00 00 00
	*/
	tx := CreateBuff(4 + 2 + 4 + len(技能名称) + 4*8 + 1)
	tx.AddInt32(SrcId)
	tx.AddInt16(0x0131)
	tx.AddStringAndLen(技能名称) //技能名称
	tx.AddInt32(DecId)
	tx.AddInt32(x)
	tx.AddInt32(y)
	tx.AddInt32(0)
	//先对自己发送
	rt.AddHeadSend10(0x0B, [][]byte{tx.Buff[:4], tx.Buff[4:]})

	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}

//功能 人物拿起武器，并通知周围人  周围人是否可以未测试
func (rt *RunTime) 动作_人物拿起武器(拿起武器 bool) {
	//先对自己发出信息
	tx := CreateBuff(3)
	tx.AddInt16(0x00C4)
	if 拿起武器 == true {
		tx.AddByte(0x15)
	} else {
		tx.AddByte(0x16)
	}
	//先对自己发送消息
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})

	tx = CreateBuff(4 + 3)
	tx.AddInt32(rt.V角色内容.Id)
	tx.AddInt16(0x00C5)
	if 拿起武器 == true {
		tx.AddByte(0x15)
	} else {
		tx.AddByte(0x16)
	}
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}

//0B,B4060700 ,2E 01 07 00 00 00 54 61 54 61 63 6B 00 B3060700 8C5AFBFF 78D00C00 9EE6FFFF 7E3F553F 01
func (rt *RunTime) 动作_人物攻击内容(SrcId int32, DecId int32, x int32, y int32, 技能名称 string) {
	tx := CreateBuff(4 + 2 + 4 + 10 + 4 + 4 + 4 + 4 + 4)
	tx.AddInt32(SrcId)
	tx.AddInt16(0x012E)
	tx.AddStringAndLen(技能名称) //可能是动作
	tx.AddInt32(DecId)
	tx.AddInt32(x)
	tx.AddInt32(y)
	tx.AddInt32(-6498)
	tx.AddFloat(1)
	tx.AddByte(0x01)
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}
func (rt *RunTime) 动作_怪物攻击内容(SrcId int32, DecId int32, x int32, y int32, 技能名称 string) {
	/*
		0B 14 04 00 24 00 00 00 00 00 00 00 00 00 00 00 2B 14
		9B D8 FF FF
		2F 01
		0A 00 00 00 42 61 73 69 63 41 74 6B 31 00 EB 75 FE FF 6C 70 FB FF 84 E7 0C 00 00 00 00 00 00 00 80 3F
		2F 01 0A 00 00 00 42 61 73 69 63 41 74 6B 31 00 CC 8C 07 00 8C 73 FB FF 20 E7 0C 00 00 00 00 00 00 00 80 3F
	*/
	tx := CreateBuff(4 + 2 + 4 + 10 + 4 + 4 + 4 + 4 + 4)
	tx.AddInt32(SrcId)
	tx.AddInt16(0x012F)
	tx.AddStringAndLen(技能名称) //可能是动作
	tx.AddInt32(DecId)
	tx.AddInt32(x)
	tx.AddInt32(y)
	tx.AddInt32(0)
	tx.AddFloat(1)

	//先对自己发送消息
	rt.AddHeadSend10(0x0B, [][]byte{tx.Buff[:4], tx.Buff[4:]})
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}
func (rt *RunTime) 动作_人物受到攻击(技能 string, 攻击类型 byte) {
	tx := CreateBuff(114/3 + 18)
	tx.AddInt16(0x0133)
	tx.AddStringAndLen(技能) //可能是动作
	tx.AddInt32(0x0001E3CC)
	tx.AddInt32(0)
	tx.AddByte(攻击类型) //00好似电击 01 是攻击  02是击倒  03是回避  04是盾牌防御  05是抵抗
	switch 攻击类型 {
	case 00, 0x04:
	default:
		tx.AddInt32(0x0A)
		tx.AddInt32(rt.V角色内容.X)
		tx.AddInt32(rt.V角色内容.Y)
		tx.AddByte(0) //第二次发现
	}
	rt.AddHeadSend10(0x0B, [][]byte{{}, tx.Buff})
}

//0B,66 6B 07 00 ,BD 00 00 00 00 00 78 55 FB FF 48 BF 0C 00 D1 07 87 40 00 00 00 00
//0B,66 6B 07 00 ,BD 00 00 00 00 00 DC 55 FB FF 48 BF 0C 00 D1 07 87 40 00 00 00 00
//0A,,BB 00 E3 02 0E 00  未知
//0E,66 6B 07 00 78 55 FB FF 48 BF 0C 00 00 00 00 00
//0B,66 6B 07 00 ,BD 00 DB F9 7E 3F 14 55 FB FF 48 BF 0C 00 17 E8 FF FF 00 00 00 00
func 动作_位置移动(内容 *StructMap, speed float32, oldX, oldY, newX, newY int32) {
	//发送
	tx := CreateBuff(4 + 2 + 4 + 4 + 4 + 4 + 4)
	tx.AddInt32(内容.Id)
	tx.AddInt16(0x00BD) //00
	tx.AddFloat(speed)
	tx.AddInt32(newX)
	tx.AddInt32(newY)
	tx.AddInt32(-5215) //-6121
	tx.AddInt32(0)
	向周边发送消息(内容, 0x0B, 4, tx.Buff) //排除自己
}
func 动作_停止移动(内容 *StructMap) {
	//发送停止运动
	tx := CreateBuff(4 + 2 + 4 + 4 + 4 + 4 + 4)
	tx.AddInt32(内容.Id)
	tx.AddInt16(0x00BD) //00
	tx.AddFloat(0)
	tx.AddInt32(内容.X)
	tx.AddInt32(内容.Y)
	tx.AddInt32(0x408707D1)
	tx.AddInt32(0)
	向周边发送消息(内容, 0x0B, 4, tx.Buff) //排除自己
}

//自己升级可以看见，但无法看到其它人物升级
func (rt *RunTime) 动作_人物升级() {
	tx := CreateBuff(2 + 4 + 13 + 4 + 4)
	tx.AddInt32(rt.V角色内容.Id)
	tx.AddInt16(0x0125)
	tx.AddStringAndLen("Basic_LevelUp")
	tx.AddInt32(0)
	tx.AddInt32(0)

	//先向自己发送
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff[4:]})
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}

func (rt *RunTime) 动作_怪物掉蓝(id int32, 掉血量 int32) {
	tx := CreateBuff(2 + 4 + 8 + 4 + 4 + 9)
	tx.AddInt16(0x0135)
	tx.AddInt32(id)
	tx.AddInt64(0)
	tx.AddInt32(0x00)
	tx.AddInt32(掉血量)
	tx.AddBytes(String2Byte("0095010000F4010000"))
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_怪物致命(id int32, 掉血量 int32) {
	tx := CreateBuff(2 + 4 + 8 + 4 + 4)
	tx.AddInt16(0x0135)
	tx.AddInt32(id)
	tx.AddInt64(0)
	tx.AddInt32(0x01)
	tx.AddInt32(掉血量)
	tx.AddBytes(String2Byte("0095010000F4010000"))
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_怪物眩晕(id int32, 掉血量 int32) {
	tx := CreateBuff(2 + 2 + 8 + 4 + 4 + 9)
	tx.AddInt16(0x0135)
	tx.AddInt32(id)
	tx.AddInt64(0)
	tx.AddInt32(0x02) //2 3都行
	tx.AddInt32(掉血量)
	tx.AddBytes(String2Byte("0095010000F4010000"))
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_怪物闪避(id int32) {
	tx := CreateBuff(114/3 + 18)
	tx.AddInt32(id)
	tx.AddInt16(0x0133)
	tx.AddStringAndLen("BasicAtk1") //可能是动作
	tx.AddInt32(0x0001E3CC)
	tx.AddInt32(0)
	tx.AddByte(04) //00好似电击 01 是攻击  02是击倒  03是回避  04是盾牌防御  05是抵抗
	rt.AddHeadSend10(0x0B, [][]byte{tx.Buff[:4], tx.Buff[4:]})
}
func (rt *RunTime) 动作_怪物掉血(id int32, 掉血量 int32) {
	tx := CreateBuff(2 + 4 + 4 + 4 + 4 + 4 + 9)
	tx.AddInt16(0x0135)
	tx.AddInt32(id)
	tx.AddInt32(0)
	tx.AddInt32(0)
	tx.AddInt32(0x04)
	tx.AddInt32(掉血量)
	tx.AddBytes(String2Byte("0095010000F4010000"))
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}

//功能 一个角色将怪物杀死 并通知所有周边人物
func (rt *RunTime) 动作_自己死亡() {
	tx := CreateBuff(4 + 2 + 4 + 1)
	tx.AddInt16(0x00C3)
	tx.AddInt32(rt.V角色内容.Id)
	tx.AddByte(0)
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}

//功能 一个角色将怪物杀死 并通知所有周边人物
func 动作_怪物死亡(内容 *StructMap) {
	tx := CreateBuff(4 + 2 + 4 + 1)
	tx.AddInt32(内容.Id)
	tx.AddInt16(0x00C3)
	tx.AddInt32(内容.Id)
	tx.AddByte(0)
	向周边发送消息(内容, 0x0B, 4, tx.Buff)
}

//BASIC_Start 出现新人物
func (rt *RunTime) 动作_效果(药水名称 string, t0 int32, t1 int32) {
	tx := CreateBuff(4 + 2 + 4 + len(药水名称) + 4 + 4)
	tx.AddInt32(rt.V角色内容.Id)
	tx.AddInt16(0x0125)
	tx.AddStringAndLen(药水名称)
	tx.AddInt32(t0)
	tx.AddInt32(t1)
	//先向自己发送
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff[4:]})
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
}

// NULL_ENCHANT  技能	迷惑   可以将指定内容变成另一种怪物
func 动作_内容加辅助技能(内容 *StructMap, 技能英文名 string, 秒 float32) {
	tx := CreateBuff(30)
	tx.AddInt32(内容.Id)
	tx.AddInt16(0x013B)
	tx.AddStringAndLen(技能英文名)
	tx.AddInt32(int32(time.Now().Add(time.Second * time.Duration(秒)).Unix()))
	if len(内容.V变身怪物) != 0 {
		tx.AddStringAndLen(内容.V变身怪物)
		tx.AddStringAndLen(内容.V变身怪物)
	} else {
		tx.AddStringAndLen("")
		tx.AddStringAndLen("None")
	}

	if 内容.V类别 == E类别_人物 {
		if rt, ok := m_RunTime.Load(内容.V内容.(*S角色列表).V名字); ok == true {
			rt.(*RunTime).AddHeadSend10(0x0A, [][]byte{{}, tx.Buff[4:]})
		}
	}
	向周边发送消息(内容, 0x0B, 4, tx.Buff)
}
func 动作_内容删除辅助技能(内容 *StructMap, 技能英文名 string, 秒 float32) {
	tx := CreateBuff(30)
	tx.AddInt32(内容.Id)
	tx.AddInt16(0x013C)
	tx.AddStringAndLen(技能英文名)

	if 内容.V类别 == E类别_人物 {
		if rt, ok := m_RunTime.Load(内容.V内容.(*S角色列表).V名字); ok == true {
			rt.(*RunTime).AddHeadSend10(0x0A, [][]byte{{}, tx.Buff[4:]})
		}
	}
	向周边发送消息(内容, 0x0B, 4, tx.Buff)

}
func (rt *RunTime) 动作_同步角色穿戴装备(位置 byte, 物品 *Struct物品列表) {
	tx := CreateBuff(30)
	tx.AddInt32(rt.V角色内容.Id)
	tx.AddInt16(0x00C5)

	if 物品 != nil {
		tx.AddByte(0x20)
		tx.AddByte(位置)
		rt.物品_简要信息(tx, 物品)
	} else {
		tx.AddByte(0x21)
		tx.AddByte(位置)
	}
	向周边发送消息(rt.V角色内容, 0x0B, 4, tx.Buff)
	/*12 00 00 00 54 72 69 75 6D 70 68 75 73 56 61 6D 62 72 61 63 65 00
	0B 00 00 00 01 12 00 00 00 47 6F 64 54 68 69 72 64 44 65 66 65 6E 73 65 30 38 00
	0A 00 00 00 D7 A3 B8 A3 20 6C 76 2E 38 00 12 00 00 00 54 72 69 75 6D 70 68 75 73 56 61 6D 62 72 61 63 65 00
	0E 00 00 00 20 CC D8 C0 B3 C6 D5 D6 AE BB A4 B1 DB 00
	00 00 00 00 02 12 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 01 01 00 00 00 00*/
}
func 动作_魔法攻击起手式(内容 *StructMap, 技能名称 string, 被攻击ID int32, x, y, z int32, t float32) {
	tx := CreateBuff(40)
	tx.AddInt32(内容.Id)
	tx.AddInt16(0x0130) //命令
	tx.AddStringAndLen(技能名称)
	tx.AddInt32(被攻击ID)
	tx.AddInt32(x)
	tx.AddInt32(y)
	tx.AddInt32(z)
	tx.AddFloat(t)
	向周边发送消息(内容, 0x0B, 4, tx.Buff)
}
func (rt *RunTime) 动作_显示宠物(tx *Buff, 宠物 *S宠物列表) {
	//0A 14 00 00 52 00 00 00 00 00 00 00 00 00 00 00 58 14
	//6B 01 01 04 00 00 00 45 67 67 00 07 00 00 00 B9 E2 CD B7 C7 BF 00 04 00 00 00 04 00 00 00 00 00 00 00 00 4F 00 00 00 01 00 00 00 00 00 00 00 08 00 00 00 07 00 00 00 C9 FD BC B6 BF A9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	/*
		04 00 00 00
		00 00 00 00 00
		4F 00 00 00
		01 00 00 00
		00 00 00 00

		08 00 00 00
		07 00 00 00 C9 FD BC B6 BF A9 00
		00 00 00 00
		00 00 00 00
		00 00 00 00
		00 00 00 00
		00 00 00 00
	*/
	tx.AddInt16(0x016B)
	tx.AddInt16(0x01)
	tx.AddStringAndLen(宠物.V宠物阶段)
	tx.AddStringAndLen(宠物.V宠物名称)
	tx.AddInt32(宠物.V等级)
	tx.AddInt32(0x04)
	tx.AddByte(0x00)
	tx.AddInt32(0x00)
	tx.AddInt32(0x4F)
	tx.AddInt32(0x01)
	tx.AddInt32(0x00)
	tx.AddInt32(0x08)
	tx.AddStringAndLen(宠物.V信息)
	tx.AddInt32(宠物.V攻击点数)
	tx.AddInt32(宠物.V背包点数)
	tx.AddInt32(宠物.VHP点数)
	tx.AddInt32(宠物.VMP点数)
	tx.AddInt32(宠物.V宠物点数)
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
func (rt *RunTime) 动作_关闭宠物(tx *Buff) {
	tx.AddInt16(0x016C)
	tx.AddInt16(0x01)
	rt.AddHeadSend10(0x0A, [][]byte{{}, tx.Buff})
}
